home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / PRGCTRL.I < prev    next >
Encoding:
Modula Implementation  |  1994-01-18  |  4.6 KB  |  187 lines

  1. IMPLEMENTATION MODULE PrgCtrl; (* V#053 *)
  2. (*$Y+,C-,L-,R-,N+*)
  3.  
  4. (*
  5.   23.10.88: GetBasePageAddr holt sich BP-Ptr aus ProcessID des TOS und
  6.               nicht mehr über GetPDB.
  7.   15.01.89: Accessory nach 23.10.88 wieder korrekt.
  8.   23.01.89: Accessory kommt auch mit residenten Prgs klar.
  9.   17.01.94: TermProcess ruft nun Pterm aus MOSCtrl auf.
  10. *)
  11.  
  12. FROM SYSTEM IMPORT ASSEMBLER, ADR, WORD, ADDRESS, TSIZE, LONGWORD;
  13.  
  14. FROM MOSGlobals IMPORT MemArea;
  15.  
  16. IMPORT MOSCtrl;
  17. FROM MOSCtrl IMPORT ProcessID, GetPDB, TermEntry, EnvEntry, ModLevel, PDB,
  18.         ExitCode, ActMOSProcess, EnvRoot, Pterm;
  19.  
  20. (* ! Storage darf nicht importiert werden ! *)
  21.  
  22. VAR dummy: ADDRESS;
  23.  
  24. PROCEDURE TermProcess ( ec: Integer );
  25.   BEGIN
  26.     ASSEMBLER
  27.         JMP     Pterm
  28.     END
  29.   END TermProcess;
  30.  
  31.  
  32. PROCEDURE CatchProcessTerm ( VAR hdl: TermCarrier; call: Proc; wsp: MemArea );
  33.   BEGIN
  34.     ASSEMBLER
  35.         CLR.L   -(A7)
  36.         MOVE.L  A7,(A3)+
  37.         MOVE.L  #dummy,(A3)+
  38.         JSR     GetPDB
  39.         MOVE.L  (A7)+,A0
  40.         MOVE.L  A0,D0
  41.         BEQ     noMod
  42.         MOVE.L  -(A3),D2
  43.         MOVE.L  -(A3),A2
  44.         MOVE.L  -(A3),D0
  45.         MOVE.L  -(A3),A1
  46.         MOVE.L  PDB.TermProcs(A0),D1    ; oldHdl:= pdb.TermProcs
  47.         MOVE.L  A1,PDB.TermProcs(A0)    ; pdb.TermProcs:= ADR (hdl)
  48.         MOVE.L  D1,TermEntry.next(A1)   ; hdl.next:= oldHdl
  49.         MOVE.L  D0,TermEntry.call(A1)   ; hdl.call:= call
  50.         MOVE.L  D2,TermEntry.wsp.length(A1)
  51.         MOVE.L  A2,TermEntry.wsp.bottom(A1)
  52.         RTS
  53.       noMod:
  54.         TRAP    #6
  55.         DC.W    -14     ; Ill. call
  56.         SUBA.W  #$10,A3
  57.     END
  58.   END CatchProcessTerm;
  59.  
  60.  
  61. PROCEDURE SetEnvelope ( VAR hdl: EnvlpCarrier; call: EnvlpProc; wsp: MemArea );
  62.   BEGIN
  63.     ASSEMBLER
  64.         MOVE.L  -(A3),D2
  65.         MOVE.L  -(A3),D0
  66.         MOVE.L  -(A3),D1
  67.         MOVE.L  -(A3),A1        ; hdl
  68.         
  69.         ; hdl.next:=ADR(EnvRoot)
  70.         ; hdl.prev:=EnvRoot.prev
  71.         ; EnvRoot.prev^.next:= ADR (hdl)
  72.         ; EnvRoot.prev:= ADR (hdl)
  73.         LEA     EnvRoot,A2
  74.         MOVE.L  A2,EnvEntry.next(A1)
  75.         MOVE.L  EnvEntry.prev(A2),A0
  76.         MOVE.L  A0,EnvEntry.prev(A1)
  77.         MOVE.L  A1,EnvEntry.next(A0)
  78.         MOVE.L  A1,EnvEntry.prev(A2)
  79.         
  80.         CLR.W   EnvEntry.level(A1)
  81.         MOVE.L  D1,EnvEntry.call(A1)
  82.         MOVE.L  D0,EnvEntry.wsp.bottom(A1)
  83.         MOVE.L  D2,EnvEntry.wsp.length(A1)
  84.     END
  85.   END SetEnvelope;
  86.  
  87. PROCEDURE SysSetEnvelope (VAR hdl: EnvlpCarrier; call: EnvlpProc; wsp: MemArea);
  88.   BEGIN
  89.     ASSEMBLER
  90.         MOVE.L  -16(A3),-(A7)
  91.         JSR     SetEnvelope
  92.         MOVE.L  (A7)+,A0
  93.         SUBQ.W  #1,EnvEntry.level(A0)   ; level:= -1
  94.     END;
  95.   END SysSetEnvelope;
  96.  
  97. PROCEDURE RemoveEnvelope ( VAR hdl: EnvlpCarrier );
  98.   BEGIN
  99.     ASSEMBLER
  100.         ; next^.prev:= prev;
  101.         ; prev^.next:= next
  102.         MOVE.L  -(A3),A0
  103.         MOVE.L  EnvEntry.next(A0),A1
  104.         MOVE.L  EnvEntry.prev(A0),A2
  105.         MOVE.L  A2,EnvEntry.prev(A1)
  106.         MOVE.L  A1,EnvEntry.next(A2)
  107.     END
  108.   END RemoveEnvelope;
  109.  
  110. PROCEDURE GetBasePageAddr ( VAR bpp: ADDRESS );
  111.   BEGIN
  112.     ASSEMBLER
  113.         MOVE.L  -(A3),A1
  114.         MOVE.L  ActMOSProcess,(A1)
  115.     END
  116.   END GetBasePageAddr;
  117.  
  118. PROCEDURE ActiveProcess (): ADDRESS;
  119.   BEGIN
  120.     ASSEMBLER
  121.         MOVE.L  ProcessID,A0
  122.         MOVE.L  (A0),(A3)+
  123.     END
  124.   END ActiveProcess;
  125.  
  126. PROCEDURE BaseProcess (): ADDRESS;
  127.   BEGIN
  128.     ASSEMBLER
  129.         MOVE.L  MOSCtrl.BaseProcess,(A3)+
  130.     END
  131.   END BaseProcess;
  132.  
  133. PROCEDURE ProcessLinked (): BOOLEAN;
  134.   BEGIN
  135.     ASSEMBLER
  136.         CMPI    #1,ModLevel
  137.         SLS     D0
  138.         ANDI    #1,D0
  139.         MOVE    D0,(A3)+
  140.     END
  141.   END ProcessLinked;
  142.   
  143.  
  144. PROCEDURE Accessory (): BOOLEAN;
  145.   BEGIN
  146.     ASSEMBLER
  147.         ; nicht BaseProcess prüfen, damit ein unter dem Acc gestartetes
  148.         ; Modul auch FALSE erhält
  149.         MOVE.L  ActMOSProcess,A0
  150.         MOVE.L  A0,D0
  151.         BEQ     nope
  152.         TST.L   $24(A0)         ; parent's basepage
  153.       nope
  154.         SEQ     D0
  155.         ANDI    #1,D0
  156.         MOVE    D0,(A3)+
  157.     END
  158.   END Accessory;
  159.  
  160. PROCEDURE ProcessState (): PState;
  161.   BEGIN
  162.     ASSEMBLER
  163.         SUBQ.L  #4,A7
  164.         MOVE.L  A7,(A3)+
  165.         MOVE.L  #dummy,(A3)+
  166.         JSR     GetPDB
  167.         MOVE.L  (A7)+,A0
  168.         MOVE.W  PDB.processState(A0),(A3)+
  169.     END
  170.   END ProcessState;
  171.  
  172. PROCEDURE CurrentExitCode (): INTEGER;
  173.   BEGIN
  174.     ASSEMBLER
  175.         MOVE    ExitCode,(A3)+
  176.     END
  177.   END CurrentExitCode;
  178.   
  179. PROCEDURE SetNewExitCode ( i: INTEGER );
  180.   BEGIN
  181.     ASSEMBLER
  182.         MOVE    -(A3),ExitCode
  183.     END
  184.   END SetNewExitCode;
  185.  
  186. END PrgCtrl.
  187.